Insert Rows Missing as Missing Records in SAS

Posted on Oct 13, 2014 in Computer Science

Things under legendu.net/outdated are outdated technologies that the author does not plan to update any more. Please look for better alternatives.

I recent come across a problem. I have a table A in SAS with columns x, y and z. The table almost exhaust the Cartesian product of x and y but has some rows missing. I need to create macro variables with the Cartesian product of x and y as names and z as corresponding values. If a combination of x and y is missing from the table, then set it as missing value. I came up with 2 approaches to this problem. The first way is to create macro variables based on table A, and then loop through the Cartesian product of x and y to check whether a macro variable exists or not (with the help of %symexists). If a macro variable does not exists, then create it with missing value. The second approach is to complete table A with missing rows (with the help of left/right join in SQL) and then create macro variables based on it. The first approach is a little bit tedious and took the second approach. Here I demonstrate in detail how I did it.

To make illustration convenient, suppose A is as below,

x y z
a 1 0.33
a 3 0.91
b 1 1.38
b 2 8.7
b 3 5.1
c 2 5.78
c 3 8.6

and x = (a, b, c) and y = (1, 2, 3) . First, we need to create a table of the Cartesian product of x and y. Please refer to this post about how to do it. Now suppose we have the Cartesian product of x and y in the table cart, we can complete missing rows with z set as missing value using the following SQL code.

proc sql;
    select
        cart.*,
        A.z
    from 
        A
    right join
        cart
    on
        A.x = cart.x
    and 
        A.y = cart.y
    ;
quit;